home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tiger Disk 6
/
Tiger_Disk_006_19xx_Tiger-Crew-Disk_de_Side_B.d64
/
7 mk
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2023-02-26
|
7KB
|
165 lines
8 clr
10 u$="[197][197][197][197][197][197][197][197][197][197]":o$="[164][164][164][164][164][164][164][164][164]"
110 poke826,238:poke827,0:poke828,128:poke829,96
200 print"[147][164][164]";o$;o$;o$;o$:print"syntax-lehrgang 'maschinensprache' (7)
205 b$[178]"operationen
210 printo$;o$;o$;"[164][164][164][164][164]":print"1.3.2. arithmetische ";b$;"[146] (ii)
220 [153]"wir kennen bisher die arithmetischen
230 printb$;" adc und sbc, also addition
240 [153]"und subtraktion. beide befehle werden
250 print"jedoch selten benoetigt. viel haeufiger
260 [153]"sind vergleichs";b$;", sowie in-
270 print"krementier- und dekrementierbefehle.
280 [153]"diese werden wir heute kennenlernen.
310 i=1:gosub5000:ifflthen200
400 print"[147]es gibt drei vergleichs";b$;":
410 [153]"cmp, cpx und cpy. der erste buchstabe c
420 print"bedeutet bei allen dreien compare, also
430 [153]"'vergleiche'. verglichen werden zwei
440 print"datenworte (bytes). der vergleichsvor-
450 [153]"gang beeinflusst jedoch nur die flags,
460 print"keine register.man kann also anhand der
470 [153]"flags feststellen, welches der beiden
480 print"byte groesser war, oder ob sie gleich":print"waren.
500 [153]"beeinflusst werden das n-,z- und c-flag
510 i=2:gosub5000:ifflthen200
600 print"[147]das ist wichtig! denken sie z.b. an die
610 [153]"for/next-schleife in basic: am ende je-
620 print"des schleifendurchlaufes wird eine ver-
630 [153]"gleichsoperation durchgefuehrt, die den
640 print"laufparameter (meist i) mit einer vor-
650 [153]"gegebenen oberen grenze vergleicht. je
660 print"nach resultat des vergleichs wird die
670 [153]"schleife ein weiteres mal durchlaufen
680 print"oder nicht. und die wichtigkeit der
690 [153]"for/next-schleife ist ja bekannt.
740 i=3:gosub5000:ifflthen400
800 print"[147][164][164][164]":print"cmp[146]: compare memory and accumulator"
810 print" [197] [197][197]
820 [153]"vom ac wird das adressierte byte sub-
830 print"trahiert.der befehl cmp # $0f berechnet
850 [153]"also die differenz ac-$0f.
860 print"das ergebnis dieser subtraktion steht
870 [153]"aber im gegensatz zu sbc anschliessend
880 print"nicht im ac. es taucht auch in keinem":print"[197][197][197][197][197]
890 [153]"anderen speicher auf! nur die flas n,z,
900 print"und c veraendern entsprechend der sub-
910 [153]"traktion ihren wert. der inhalt des ac
920 print"ist vor und nach dem befehl cmp gleich.
930 i[178]4:[141]5000:[139]fl[167]600
1000 [153]"loadtototo":[153]"cpxwait: compare memory and x-register
1010 print" [197] [197]";spc(15);"[197]
1020 a$[178]"dasselbe wie cmp, nur wird das byte vom":[153]a$
1030 [153]"x";:b$[178]"r anstatt vom ac subtrahiert.":[153]b$
1040 [153]"tototo":[153]"cpywait: compare memory and y-register
1050 print" [197] [197]";spc(15);"[197]":printa$:print"y";:printb$
1080 print"auch die befehle cpx und cpy beeinflus-
1090 [153]"sen nur die flags n/z/c, nicht jedoch
1100 print"den inhalt des xr oder yr.
1130 i[178]5:[141]5000:[139]fl[167]800
1200 [153]"loaddie inkrementierbefehle:":[153]u$;u$;"valvalval
1210 print"[164][164][164]":print"inc[146] increment memory by one":print" [197][197][197]
1220 [153]"der inhalt des adressierten speichers
1230 a$="wird um eins erhoeht.":printa$;:print" z.b. erhoeht der
1240 [153]"befehl inc $0123 den inhalt des spei-
1250 print"chers $0123 um 1. aus $00 wird $01, aus
1260 [153]"$aa wird $ab, aus $ff wird $00 (!).
1270 print"[164][164][164]":print"inx[146] increment xr by one":print" [197][197]";spc(8);"[197]
1280 b$[178]"der inhalt des ":[153]b$;"xr ";a$
1290 [153]"tototo":[153]"inywait increment yr by one":[153]" valval";[166]8);"val
1300 printb$;"yr ";a$
1320 i=6:gosub5000:ifflthen1000
1400 print"[147]alle drei inkrementier-befehle beein-
1410 [153]"flussen die flags n und z.das bedeutet:
1420 print"wurde das adressierte byte, bzw. das xr
1430 [153]"oder yr beim inkrementieren null (ne-
1440 print"gativ),so wird das z (n) -flag gesetzt.
1450 [153]"auch das inkrementieren ist uns aus der
1455 print"for/next-schleife wohlbekannt: am ende
1460 [153]"des schleifendurchlaufes wird der lauf-
1470 print"index automatisch um 1 erhoeht.
1510 i[178]7:[141]5000:[139]fl[167]1200
1600 [153]"loaddie dekrementierbefehle":[153]u$;u$;"valvalval
1610 print"[164][164][164]":print"dec[146] decrement memory by one":print" [197][197][197]
1620 [153]b$;" adressierten speichers
1630 print"wird um eins erniedrigt,z.b. erniedrigt
1640 [153]"der befehl 'dec $0123' den inhalt des
1650 print"speichers $0123 um 1. aus $ab wird $aa,
1660 [153]"aus $01 wird $00, aus $00 wird $ff (!).
1670 print"[164][164][164]":print"dex[146] decrement xr by one":print" [197][197]";spc(8);"[197]
1680 [153]b$;"xr ";:a$[178]"wird um 1 erniedrigt.":[153]a$
1690 [153]"tototo":[153]"deywait decrement yr by one":[153]" valval";[166]8);"val
1700 printb$;"yr ";:printa$
1710 i=8:gosub5000:ifflthen1400
1800 print"[147]ebenso wie die inkrementierbefehle be-
1810 [153]"einflussen die dekrementierbefehle nur
1820 print"die flags n und z. die dekrementierbe-
1830 [153]"fehle sind also die genaue umkehrung
1840 print"der inkrementierbefehle.
1850 [153]"denken sie an for/next-schleifen mit
1855 print"'step-1', dann wird ihnen die bedeutung
1860 [153]"der dekrementierbefehle klar.
1910 i=9:gosub5000:ifflthen1600
2000 print"[147]beispiele:":printu$
2005 print"1. es mag zuerst unsinnig erscheinen,
2010 [153]"dass bei cmp/cpx/cpy das subtraktions-
2015 print"ergebnis verloren geht. da dadurch aber
2020 [153]"das zu vergleichende byte im ac (xr,yr)
2030 print"erhalten bleibt,kann man beliebig viele
2040 [153]"solche vergleiche direkt hintereinander
2050 print"durchfuehren, ohne das zu vergleichende
2055 [153]"byte stets wieder neu in den ac (xr,yr)
2060 print"laden zu muessen.
2110 i[178]10:[141]5000:[139]fl[167]1800
2200 [153]"load2. neben dem verlust des ergebnisses
2210 print"unterscheiden sich cmp und sbc noch im
2220 [153]"verhalten auf des c-flag: vor cmp muss
2230 print"das c-flag nicht gesetzt werden.
2240 [153]"3. als schleifenzaehler verwendet man
2250 print"meist das xr oder das yr. die befehle
2260 [153]"inx/iny bzw. dex/dey machen das zaehlen
2270 print"mit diesen indexregistern besonders
2280 [153]"einfach.
2310 i=11:gosub5000:ifflthen2000
2400 print"[147]aufgaben:":printu$
2410 print"1. was fuer eine adressierungsart haben
2420 [153]"die befehle inx/iny/dex/dey stets?
2430 print"2. wieviele byte haben sie daher stets?
2440 [153]"3. im ac stehe das datenwort $01. wel-
2450 print"ches flag wird durch den folgenden be-
2460 [153]"fehl gesetzt: cmp # $01 ?
2470 print"4. und welches,wenn der ac $00, welches
2480 [153]"wenn er $02 enthaelt ?
2510 i=12:gosub5000:ifflthen2200
2600 print"[147]5. die aufgaben 3 und 4 sind wichtig.
2620 [153]"falls sie sie nicht bearbeitet haben,
2630 print"blaettern sie nochmal zurueck!
2640 [153]"6. der speicher $8000 enthaelt das zei-
2650 print"chen in der linken oberen bildschirm-
2660 [153]"ecke. schreiben sie ein programm, das
2670 print"diesen speicher inkrementiert.vergessen
2680 [153]"sie nicht rts! rufen sie es mehrfach
2690 print"hintereinander auf und beobachten sie
2700 [153]"den bildschirm.
2710 i=13:gosub5000:ifflthen2400
2800 print"[147]a
2805 [153]"die loesung von aufgabe 6 steht ab 826
2810 print"im ram. sie koennen sie aufrufen.
2820 [153]"zur demonstration fuehren wir sie ihnen
2830 print"vor. beachten sie die linke obere bild-
2840 [153]"schirmecke!
2842 forw=0to10000:next
2850 fori=0to255
2860 sys826
2870 forw=0to150
2880 nextw,i
2910 print" - seite 14 - <+> [145][164][164][164][164][157][157][157][157]ende[146] <-> von vorne";
3060 gosub5020:onflgoto0:print"[147]":end:run
5000 rem umblaettern
5010 print" - seite";i;"- <+> weiter <-> zurueck";
5020 fori=0to11:getx$:next
5030 getx$:ifx$=""then5030
5040 ifx$="+"thenfl=0:return
5050 ifx$="-"thenfl=1:return
5060 goto5030